perm filename IN[MUS,LCS] blob sn#308327 filedate 1977-10-05 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	COMMENT: ******INITIALIZATION FILE FOR MUSIC.DMP********  3/77
C00005 00003	FUNCTION SEG(ARRAY FUNC)
C00007 00004	FUNCTION SYNTH(ARRAY FUNC)
C00009 00005	<comment: type 'SETMAG nchns, srate'  
C00012 00006	<FOUR INSTRUMENTS FOR ELEMENTRY COMPUTER MUSIC (+SIMP)
C00015 ENDMK
C⊗;
COMMENT: ******INITIALIZATION FILE FOR MUSIC.DMP********  3/77

	 TO CREATE MUSIC.DMP RUN COMMAND FILE, 'LCSMUS.CMD',
	 THEN READ IN THIS FILE BEFORE SAVING ON THE SYSTEM.

	THE FOLLOWING FUNCTIONS ARE SET UP HEREIN:
		SEE(ARRAY FUNC)
		SEG(ARRAY FUNC)
		SYNTH(ARRAY FUNC)
		POWER( N, X )   [GIVES POWER OF N TO THE XTH] ;

VARIABLE MAG,C,CF,CS,D,DF,DS,E,EF,ES,F,FF,FS,G,GF,GS,A,AF,AS,B,BF,BS;
C←261.62;  CS←DF←277.18;  D←293.66;  DS←EF←311.13;  E←FF←329.63;
F←ES←349.23;  FS←GF←369.99;  G←391.99;  GS←AF←415.31;
A←440;    AS←BF←466.16;  B←493.89; CF←B/2; BS←C*2;

EXTERNAL FUNCTION
	SIN(A),  EXP(A),  ALOG(A),  SQRT(A),  RDNUM(X),
	DPYSET(INTEGER POG,ARRAY DPYBUF,INTEGER SIZE),
	ALINE(INTEGER X1,INTEGER Y1,INTEGER X2,INTEGER Y2),
	DPYOUT(INTEGER POG),  
	AIVECT(INTEGER X,INTEGER Y),  SIND(X),
	TYPLOC(INTEGER X,INTEGER Y),  RVECT(INTEGER X,INTEGER Y);

FUNCTION SEE(ARRAY FUNC);
     BEGIN  
	ARRAY DPY(225);  VARIABLE IY,I,IY2;
	DPYSET(2,DPY,225);  TYPLOC(-100,-412);
COMMENT  THIS VERSION MUST BE LOADED WITH %LTVRLIB (FOR 'DDCLR')
 TYPLOC MOVES ONLY WHEN USING DATADISC.;
	ALINE(-264,200,256,200);  ALINE(-266,328,-246,328);
	ALINE(-266,456,-246,456); ALINE(-266,72,-246,72);
	ALINE(-266,-56,-246,-56); ALINE(-256,-56,-256,456);
	ALINE(0,190,0,210);       ALINE(-128,190,-128,210);
	ALINE(128,190,128,210);
	IY←INT(FUNC(0)*256.0+200.0);   AIVECT(-256,IY);

COMMENT:  DISPLAY ONLY EVERY THIRD SEGMENT ;
	FOR I←1 STEP 3 UNTIL 511 DO
	  BEGIN
		IY2←INT(FUNC(I)*256.0+200.0);
		RVECT(3,IY2-IY);    IY←IY2;
	  END;    DPYOUT(2);
       END;

FUNCTION SEEIT(ARRAY FUNC);  BEGIN
	VARIABLE K;	PRINT "SEG ARRAY   "; 
	SEE(FUNC);
	END;

FUNCTION SEG(ARRAY FUNC);
BEGIN
VARIABLE X512,K,A1,A2,ST,STPP,STPS,IS,IT,DIF,RK;
  A1←0; ST←0; STPP←0; X512←0;
	WHILE STPP ≤ 1 DO
		BEGIN
		 RDNUM(A2);  
		 IF A2 =512 THEN X512←A2;
		 IF A2 =512 THEN RDNUM(A2);  RDNUM(STPP);
COMMENT: TYPE 512 AT FIRST TO USE 512 STEPS INSTEAD OF 100 STEPS.;
		 IF STPP ≤ 1 THEN A1←A2;
		END;

    WHILE STPP ≠ 999 DO   
      BEGIN  
	IS← INT(STPP*5.120+.0001);
	IF X512 ≠ 0 THEN IS←INT(STPP+.0001);
	IF IS > 512 THEN 
 	    BEGIN  
		FOR K←0 STEP 1 UNTIL 511 DO
COMMENT: READ 512 NUMS FROM A FUNC FILE.;
  		  BEGIN
		     RDNUM(RK);  FUNC(K)← RK;
		  END;
		SEEIT(FUNC); RETURN;
	    END;

	STPP ← IS-1; 		STPS ← STPP-ST;
	IS ← INT(STPS);		DIF←A2-A1;
	IT←INT(ST);		ST ← STPP;
	FOR K←0 STEP 1 UNTIL IS DO
		BEGIN
		RK ← K;
		FUNC(K+IT)  ← A1+DIF*RK/STPS; 
		END;
	IF STPP = 511 THEN SEEIT(FUNC);
	IF STPP ≥ 511 THEN RETURN;
	A1←A2;  ST←STPP;
	RDNUM(A2); RDNUM(STPP);
       END;
END;
FUNCTION SYNTH(ARRAY FUNC);
BEGIN
VARIABLE K,XX,H,FAC,CON,AMP,X,XK,J;
FOR J ← 0 STEP 1 UNTIL 511 DO  BEGIN
	FUNC(J) ← 0; END;
COMMENT: CLEAR THE ARRAY;
 
RDNUM(XX); 	IF XX = 99 THEN XX ← -XX;
H ← XX; 	IF XX < 0 THEN RDNUM(H);
WHILE H ≠ 999 DO
   BEGIN
	RDNUM(AMP); 
	X ←0; CON ←0;
	IF XX < 0 THEN 
	   BEGIN
		RDNUM(X);  RDNUM(CON);
COMMENT		X ← X * 1.42222222 +1 ; COMMENT 1.422 = 512/360 ;
		X ← X * 512/360 +1;
	   END;

	FOR J ← 0 STEP 1 UNTIL 511  DO
	   BEGIN
		XK ← SIND(X*360/512) * AMP + CON;
   COMMENT: .703125 = 360/512 ;	XK ← SIND(X*.703125) * AMP + CON ;
		IF CON ≥ 100 THEN FUNC(J) ← (XK-100)*FUNC(J) ;
		IF CON < 100 THEN FUNC(J) ← FUNC(J) + XK ;
		X ← X+H;	IF X > 512 THEN X ← X-512;
	   END;
	RDNUM(H);
    END;

X ← FUNC(0);   COMMENT: NEXT FOR NORMALIZATION;
FOR J ← 1 STEP 1 UNTIL 511  DO BEGIN H ← ABS(FUNC(J)); 
	IF X < H THEN X ← H;  END;

FOR J ← 0 STEP 1 UNTIL 511  DO  BEGIN  FUNC(J) ← FUNC(J) / X ;  END;
PRINT "SYNTH ARRAY   ";	 SEE(FUNC);
END;



FUNCTION POWER(X,N)=EXP(N*ALOG(X));	comment nth power of x;

<comment: type 'SETMAG; nchns, srate'  ;
FUNCTION MAGERR(X);
	BEGIN  PRINT "IMPROPER INPUT.   ";  X←0;
	  print "Type number of channels and sample rate: ";
	  END;

FUNCTION ADJRATE; BEGIN
  IF SRATE < 6400 THEN BEGIN
    IF SRATE = 1 THEN SRATE ← 12800; IF SRATE = 2 THEN SRATE ← 25600;
    IF SRATE = 3 THEN SRATE ← 51200; IF SRATE = 4 THEN SRATE ← 102400;
    IF SRATE = 5 THEN SRATE ← 204800; IF SRATE <10 THEN SRATE ← 6400;
    IF SRATE <20 THEN SRATE ← 12800;  IF SRATE <50 THEN SRATE ← 25600;
    IF SRATE <100 THEN SRATE ← 51200; IF SRATE <200 THEN SRATE ← 102400;
    IF SRATE <400 THEN SRATE ← 204800;
  	 COMMENT: YOU MAY TYPE 1 OR 12 FOR 12800, ETC.;
		END;  END;

Function SETMAG;
    begin
	VARIABLE X; X←0;
	WHILE X = 0 DO
		BEGIN   X←1; rdnum(nchns); rdnum(srate);
		IF NCHNS > 4  THEN  MAGERR(X);
		IF NCHNS = 3  THEN  MAGERR(X);
		IF NCHNS < 1  THEN  MAGERR(X);
		ADJRATE; 

		COMMENT: ONLY 6400, 12800, ETC. ARE ACCEPTED;
		IF INT(SRATE/6400+.1) ≠ SRATE/6400 THEN MAGERR(X);
		END;

	SPEED←INT(ALOG(SRATE/6400)/ALOG(2)+.1);  mag←512/srate;
	PRINT "NCHNS=",NCHNS,"  SRATE=",SRATE,"  SPEED=",SPEED;
    end;

<SRATE←12800;MAG←512/SRATE;NCHNS←1;
SETMAG; 1 12.8;

Function SETCLOCK;
    begin
	print "Number of channels: ";
	rdnum(nchns);
	print "Clock rate: ";
	rdnum(srate);
	if srate<100 then srate←srate*1000;
	mag←512/srate;
    end;

<FOUR INSTRUMENTS FOR ELEMENTRY COMPUTER MUSIC (+SIMP)

INSTRUMENT SIMP;
OUTA←OUTA+ZOSCIL(P4,MAG*P3,P5);
END;

INSTRUMENT TOOT;
OSCIL[10](P4,10*MAG/P2,P5);
COSCIL(U1,P3*MAG,P6);<P6 IS TONE COLOR FOR 'TOOT'
OUTA←OUTA+U2;END;

INSTRUMENT CLAR;
OSCIL[10](P4,10*MAG/P2,P5);
COSCIL(U1,P3*MAG,P7);< P7 IS TONE COLOR FOR 'CLAR'
OUTA←OUTA+U2;END;

INSTRUMENT BRIT;
OSCIL[10](P4,10*MAG/P2,P5);
COSCIL(U1,P3*MAG,P8);< P8 IS TONE COLOR FOR 'BRIT'
OUTA←OUTA+U2;END;

INSTRUMENT BUZZ;
OSCIL[10](P4,10*MAG/P2,P5);
COSCIL(U1,P3*MAG,P9);< P9 IS TONE COLOR FOR 'BUZZ'
OUTA←OUTA+U2;END;

ARRAY F1,F2,F3,F4,F5,F6(512);
SEG(F1);.9 6,1 11 .9 82	.7 90  0 100; < MEZZO LEGATO
SEG(F2);1 3,1 11,.4 31,.1 51,0 100; < STACCATO
SYNTH(F3);1 1  999; < TOOT   - SINE WAVE (USED FOR SIMP ALSO)
SYNTH(F4);1,.5  3,.3  5,.2  7,.1  999; < CLAR
SYNTH(F5);1,.3  2,.4  3,.2  8,.2  12 .1  999; < BRIT
SEG(F6);-1,1   1,7   -1,14   -1,100; < BUZZ


<<<<<<<<P3←A; P4←2000; P5←F1;	COMMENT: SIMP parameter default. ;
<<<<<**OLD SPECS.**** OUTSPEC←"TEST.SND/BYTESIZE=12/SOUND";
OUTSPEC←"TEST.SND/BYTESIZE=12/HEADER/PLAY";
<<<OUTSPEC←"TEST.SND/BYTESIZE=12/PLAY";
NO_MSG←1;  < THESE 2 LINES SET UP "EZPLAY" FEATURES.

PLAY;TOOT 0 .12 C 1000 F1 F3 F4 F5 F6 0;
CLAR .12;BRIT .24;BUZZ .36;
PLAY;SIMP 0 .5 A 1000 F3;FINISH;

PRINT "
Type <RETURN>, <ALT>FREEZE before saving.";